package com.aterrizar.tipoUsuario;

import java.util.ArrayList;
import java.util.List;

import com.aterrizar.asiento.Asiento;
import com.aterrizar.exception.AccionDeUsuarioInvalidaException;
import com.aterrizar.exception.AsientoReservadoPorOtroException;
import com.aterrizar.sistema.Aterrizar;
import com.aterrizar.usuario.Usuario;

public abstract class TipoUsuario {

	private double recargo;

	public List<Asiento> buscar(Usuario usuario, String origen, String destino,
			String fechaSalida, String horaSalida, String horaLlegada) {

		List<Asiento> busqueda = Aterrizar.getInstance().buscar(usuario,
				origen, destino, fechaSalida, horaSalida,
				horaLlegada);

		return filtrar(busqueda);
	}

	public void comprar(Usuario usuario, Asiento asiento)  {

		if (!asiento.isReservado()) {
			asiento.setPasajero(usuario);
			usuario.agregarCompra(asiento);
			Aterrizar.getInstance().comprar(asiento);
		} else {
			if (usuario.getDni().equals(asiento.getReservas().first().getDni())) {
				asiento.setPasajero(usuario);
				Aterrizar.getInstance().comprar(asiento);
				usuario.agregarCompra(asiento);
				Aterrizar.getInstance().getAsientosReservados().remove(asiento);
				asiento.getReservas().clear();
			} else {
				throw new AsientoReservadoPorOtroException();
			}
		}
	}

	public List<Asiento> filtrar(List<Asiento> busqueda) {

		List<Asiento> busquedaResult = new ArrayList<Asiento>();

		for (Asiento asiento : busqueda) {
			if (!asiento.isSuperOferta())
				busquedaResult.add(asiento);
		}

		return busquedaResult;
	}

	public double getRecargo() {
		return recargo;
	}

	public void setRecargo(double recargo) {
		this.recargo = recargo;
	}

	public void reservar(Usuario usuario, Asiento asiento) {
		throw new AccionDeUsuarioInvalidaException("Usted no puede reservar asientos");
	}

	public void sobreReservar(Usuario usuario, Asiento asiento) {
		throw new AccionDeUsuarioInvalidaException("Usted no puede reservar asientos");
	}

}
